/**
 * Description:信息模板转换为静态html页面
 * @author huxh
 * @date 2012-01-15
 */
package com.cr.backbone.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

import org.apache.struts2.ServletActionContext;

import com.cr.backbone.model.MessageTemplate;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public class UtilsTemplateFreemarkerToHtml {
	
	
	/**
	 * 动态生成Html文件，根据模板
	 * 
	 * @param args
	 * @author huxh
	 * @throws Exception 
	 * @date 2012-6-18
	 */
	public static void main(String[] args) throws Exception {
		String templateContextStr="你好，我是:\"${name}\"!";
		Reader reader=new StringReader(templateContextStr);
		Configuration cfg= new Configuration();
		Template template =new Template("utilStringTemplate",reader,cfg);
		Writer out=new StringWriter();
		
		
		Map<String, String> templateContextParamsMap=new HashMap<String, String>();
		String value="胡湘华";
		templateContextParamsMap.put("name", value);
		//		template.process(templateContextParamsMap, out);
		template.process(templateContextParamsMap, out);
		
		System.out.println(out.toString());

		String path = UtilsTemplateFreemarkerToHtml.saveCreateHtmlForSrcObject(null,null);
		File file=new File(path);
		UtilsFile.saveFileToServer(file, path);
		
		
//		String textTemplate="<html><body>${name}</body></html>";
//		System.out.println(UtilsTemplateFreemarker.getInstance().getMessage(textTemplate, templateContextParamsMap));
		
	}

	
	/**
	 	// 1 笔记源数据获取
		
		// 2 模板与源数据整合
		
		// 3 数据整合后，html文件生成
		
		// 4 返回系统文件SysFile（包含新生成的html文件信息）
	 * 
	 * @return
	 * @author huxh
	 * @throws IOException 
	 * @throws TemplateException 
	 * @date 2012-6-18
	 */
	public static String saveCreateHtmlForSrcObject(MessageTemplate messageTemplate,Object obj) throws IOException, TemplateException{
		
		// 1 笔记源数据获取
		
		// 2 模板与源数据整合
		
		// 3 数据整合后，html文件生成
		
		// 4 返回系统文件SysFile（包含新生成的html文件信息）
		
		
		StringBuffer filePath = new StringBuffer("");
		String key=UtilsConfig.FILE_PATH_HTML_TEMP_ROOT_FOLDER;
		String realPath=ServletActionContext.getServletContext().getRealPath(UtilsConfigProperties.getInstance().getProperty(key));//root
	
		filePath.append(realPath);
		filePath.append("/");
		filePath.append(System.currentTimeMillis());
		filePath.append(".html");
		

		String newPath = UtilsFile.getPath(filePath.toString());
		// 1 生成模板
		// 根据freemaker 语法，获取模板
		String templateContextStr="<html><body><h1>${title}</h1><div>${content}</div></body></html>";
		Reader reader=new StringReader(templateContextStr);
		Configuration cfg=new Configuration();
		String templateName="userNoteHtmlTemplate";
		Template template = new Template(templateName,reader,cfg);

		
		// 2 生成模板参数
		Map<String,String> templateContextParamsMap=new HashMap<String, String>();
		templateContextParamsMap.put("title", "马克思");
		templateContextParamsMap.put("content", "这是一篇笔记！");
		
		File srcFile =new File(newPath);
		if(!srcFile.getParentFile().exists()){
			srcFile.getParentFile().mkdirs();
		}
		// 3 配置模板返回流
		Writer out = new OutputStreamWriter(new FileOutputStream(srcFile), "GBK");  //输出流  
		
		template.process(templateContextParamsMap, out);
		out.flush();
		out.close();
		
		System.out.println(out.toString());
		
		
		return newPath;
	}
	
	
	

	/**
	 	传入messageTemplate模板对象，obj值对象，自动进行模板与值的组合加载
	 	messageTemplate.getTemplateValue();	//模板
	 	messageTemplate.getTemplateKey();	//键值对
	 * 
	 * @return
	 * @author huxh
	 * @throws IOException 
	 * @throws TemplateException 
	 * @date 2012-6-18
	 */
	public static String saveCreateHtmlForSrcTemplateAndObject(MessageTemplate messageTemplate,Map<String,String> templateContextParamsMap) throws IOException, TemplateException{
		
		// 1 笔记源数据获取
		
		// 2 模板与源数据整合
		
		// 3 数据整合后，html文件生成
		
		// 4 返回系统文件SysFile（包含新生成的html文件信息）
		
		
		StringBuffer filePath = new StringBuffer("");
		String key=UtilsConfig.FILE_PATH_HTML_TEMP_ROOT_FOLDER;
		String realPath=ServletActionContext.getServletContext().getRealPath(UtilsConfigProperties.getInstance().getProperty(key));//root
	
		filePath.append(realPath);
		filePath.append("/");
		filePath.append(System.currentTimeMillis());
		filePath.append(".html");
		

		String newPath = UtilsFile.getPath(filePath.toString());
		// 1 生成模板
		// 根据freemaker 语法，获取模板
		String templateContextStr=messageTemplate.getTemplateValue();
		Reader reader=new StringReader(templateContextStr);
		
		Configuration cfg=new Configuration();
		String templateName="userNoteHtmlTemplate";
		Template template = new Template(templateName,reader,cfg);

		
		// 2 生成模板参数
//		templateContextParamsMap.put("title", "马克思");
//		templateContextParamsMap.put("content", "这是一篇笔记！");
		
//		templateContextParamsMap = initParams(messageTemplate.getTemplateKey(),obj);
		
		
		File srcFile =new File(newPath);
		if(!srcFile.getParentFile().exists()){
			srcFile.getParentFile().mkdirs();
		}
		// 3 配置模板返回流
		Writer out = new OutputStreamWriter(new FileOutputStream(srcFile), "GBK");  //输出流  
		
		template.process(templateContextParamsMap, out);
		out.flush();
		out.close();
		
		System.out.println(out.toString());
		
		
		return newPath;
	}


	/**
	 * 
	 * @param keys
	 * @param obj
	 * @return
	 * @author huxh
	 * @date 2012-6-18 
	 */
	public static Map<String, String> initParams(Map<String,String> templateContextParamsMap,String keys, Object obj) {
		if(keys ==null || keys.equals("") || keys.indexOf(",") <=0   || obj ==null )
			return null;
		
		String[] keysString=keys.split(",");
		if(templateContextParamsMap == null || templateContextParamsMap.isEmpty()){
			templateContextParamsMap=new HashMap<String, String>();
		}
		
		for(String keyString : keysString){
			String methodName=keyString;
			Object value = UtilsMethodReflectingValues.getValue(obj, methodName);
			String _value="";
			if(value!=null){
				_value = value.toString();
			}
			templateContextParamsMap.put(keyString,  _value);
		}
		
		return templateContextParamsMap;
	}
	
	
	
}

